package XML;

import java.io.*;
import java.util.List;
import java.util.Scanner;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * products.xml基本信息解释如下： product为商品信息节点，discount表示是否折扣，如果是折扣商品，打七折；
 * factoryaddr是工厂地址； itemno为商品编号，name为商品名称，price为商品单价，unit是计价单位，stockcount是库存量。
 * 1：读取products.xml中的商品信息，输出。 2：查找商品信息：根据输入的商品号，输出对应的商品信息。
 * 
 * @author zhaoyang
 *
 */
public class ProductRead {
	private static String newPath = "/Users/zhaoyang/eclipse-workspace/JavaAdvanced_20200522/src/XML/products_2.xml";
	// private static String oldPath =
	// "/Users/zhaoyang/eclipse-workspace/JavaAdvanced_20200522/src/XML/products.xml";
	private static Document doc = null;
	private static Element root = null;

	// 读取文件
	public static void get() {
		SAXReader reader = new SAXReader();
		try {
			doc = reader.read(new File(newPath));
		} catch (DocumentException e) {
			System.out.println("文档出问题了");
			e.printStackTrace();
			// return;
		}
		// 从未到有创建
		if (doc == null) {
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			try {
				doc = DocumentHelper.createDocument();
				doc.addElement("shop");
				System.out.println("新文件创建成功！");
			} catch (Exception e) {
				System.out.println("新文件创建失败！");
				e.printStackTrace();
			}
		}
		root = doc.getRootElement();
		// System.out.println("根节点名称是：" + root.getName());
	}

	// 保存
	public static void save(Document doc) {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		try {
			XMLWriter xm = new XMLWriter(new FileOutputStream(newPath), format);
			xm.write(doc);
			xm.close();
			System.out.println("保存成功！");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 增加产品
	public static void add(int no, String name, double price, int num, String unit, String discount,
			String factoryaddr) {
		get();
		Element ename = (Element) doc.selectSingleNode(String.format("/shop/product[name='%s']", name));
		Element eno = (Element) doc.selectSingleNode(String.format("/shop/product[itemno='%s']", no));
		if (ename != null && eno != null) {
			System.out.println("已经有编号：" + no + "，名称：" + name + "的商品了！");
			return;
		}
		Element p1 = root.addElement("product");
		p1.addAttribute("factoryaddr", factoryaddr);
		p1.addAttribute("discount", discount);
		Element pNo = p1.addElement("itemno");
		pNo.setText(String.valueOf(no));
		Element pName = p1.addElement("name");
		pName.setText(name);
		Element pPrice = p1.addElement("price");
		pPrice.setText(String.valueOf(price));
		Element pStockcount = p1.addElement("stockcount");
		pStockcount.setText(String.valueOf(num));
		Element pUnit = p1.addElement("unit");
		pUnit.setText(unit);
		save(doc);
		System.out.println(name + "添加成功！");
	}

	// 删除方法
	public static void del(String name) {
		get();
		Element ename = (Element) doc.selectSingleNode(String.format("/shop/product[name='%s']", name));
		if (ename == null) {
			System.out.println("没有找到这个" + ename + "商品");
			return;
		}
		// 找到上级后删自己
		ename.getParent().remove(ename);
		save(doc);
		System.out.println(name + "删除成功！");
	}

	// 修改信息
	public static void updata(int id, int num) {
		get();
		// 找到节点
		Element ename = (Element) doc.selectSingleNode(String.format("/shop/product[itemno='%s']", id));
		if (ename == null) {
			System.out.println("没有找到这个" + id + "产品");
			return;
		}
		// 找到子节点并修改
		ename.selectSingleNode("stockcount").setText(String.valueOf(num));
		save(doc);
		System.out.println(id + "修改成功！");
	}

	// 购买商品方法
	public static void buy(int id, int num) {
		get();
		// 找到节点
		Element ename = (Element) doc.selectSingleNode(String.format("/shop/product[itemno='%s']", id));
		if (ename == null) {
			System.out.println("没有找到这个" + id + "产品");
			return;
		}
		// 读取名称
		Element pName = (Element) ename.selectSingleNode("name");
		// 读取单价
		Element pPrice = (Element) ename.selectSingleNode("price");
		// 读取单位
		Element pUnit = (Element) ename.selectSingleNode("unit");
		// 读取库存
		Element pStockcount = (Element) ename.selectSingleNode("stockcount");
		// 把单价包装成数字
		double priceNum = new Double(pPrice.getText());
		// 把库存包装成数字
		int warehouseNum = Integer.parseInt(pStockcount.getText());
		// 是否打折
		String pDiscount;
		if (ename.attributeValue("discount").equals("true")) {
			pDiscount = "打七折！";
		} else {
			pDiscount = "不打折！";
		}
		// 原产地
		String pFactoryaddr = ename.attributeValue("factoryaddr");
		if (pFactoryaddr == null) {
			pFactoryaddr = "未知";
		}
		if (warehouseNum < num) {// 库存不足
			System.out.println(pName.getText() + "库存仅剩" + warehouseNum + pUnit.getText() + "，不能购买，感谢您的厚爱！");
			return;
		}
		// 输出购买信息
		System.out.println("您购买" + pName.getText() + "(原产地：" + pFactoryaddr + ")" + num + pUnit.getText() + "，"
				+ pDiscount + "，实际应付：" + (priceNum * num) + "元");
		updata(id, (warehouseNum - num));
	}

	// 将打印方法打包出来
	public static void print(List<Element> list) {
		for (Element e : list) {
			// 读取编号
			Element pId = (Element) e.selectSingleNode("itemno");
			// 读取名称
			Element pName = (Element) e.selectSingleNode("name");
			// 读取单价
			Element pPrice = (Element) e.selectSingleNode("price");
			// 读取单位
			Element pUnit = (Element) e.selectSingleNode("unit");
			// 读取库存
			Element pStockcount = (Element) e.selectSingleNode("stockcount");
			// 把编号包装成数字
			int idNum = Integer.parseInt(pId.getText());
			// 把单价包装成数字
			double priceNum = new Double(pPrice.getText());
			// 把库存包装成数字
			int warehouseNum = Integer.parseInt(pStockcount.getText());
			// 是否打折
			String pDiscount;
			if (e.attributeValue("discount").equals("true")) {
				pDiscount = "打七折！";
			} else {
				pDiscount = "不打折！";
			}
			// 原产地
			String pFactoryaddr = e.attributeValue("factoryaddr");
			if (pFactoryaddr == null) {
				pFactoryaddr = "未知";
			}
			System.out.println(pName.getText() + "；编号：No." + idNum + "；单价：" + priceNum + "元/" + pUnit.getText()
					+ "；库存剩余" + warehouseNum + pUnit.getText() + "；原产地：" + pFactoryaddr + "；打折信息：" + pDiscount);

		}
	}

	public static void main(String[] args) {
		while (true) {
			System.out.println("---------------合家福1店管理平台---------------");
			System.out.println(
					"=>>1、读取商品信息\n=>>2、查找商品信息\n=>>3、修改商品信息\n=>>4、购买商品信息\n=>>5、增加新商品信息\n=>>6、删除商品信息\n=>>7、退出程序");
			System.out.println("--------------------------------------------");
			System.out.println("请输入功能选择：");
			Scanner input = new Scanner(System.in);
			int num = input.nextInt();
			if (num == 1) {// 1、读取商品信息
				System.out.println("=>>1、读取商品信息");
				/**
				 * 1：读取products.xml中的商品信息，输出。
				 */
				get();
				List<Element> list = root.selectNodes("product");/// courses/course/course[coursetime>15]//"./*"
				// 循环输出符合条件的内容
				print(list);

			} else if (num == 2) {// 2、查找商品信息
				System.out.println("=>>2、查找商品信息");
				/**
				 * 2：查找商品信息：根据输入的商品号，输出对应的商品信息。
				 */
				get();
				System.out.print("请输入需要查找商品编号：");
				int inputNum = input.nextInt();
				List<Element> list2 = root.selectNodes("product[itemno=" + inputNum + "]");
				System.out.println(list2.size() == 0 ? "没找到该商品。。。" : "找到了！");
				print(list2);

			} else if (num == 3) {// 3、修改商品信息
				System.out.println("=>>3、修改商品信息");
				/**
				 * 3、修改products.xml，输入商品编号（itemno）和数量，修改对应商品的数量（stockcount）；没有找到商品号，给出提示。
				 */
				System.out.print("请输入需要修改的商品编号：");
				int ID = input.nextInt();
				System.out.print("请输入需要修改的商品数量：");
				int Num = input.nextInt();
				updata(ID, Num);

			} else if (num == 4) {// 4、购买商品信息
				System.out.println("=>>4、购买商品信息");
				/**
				 * 4、以products.xml作为基础，实现客户购买的方法，输入商品号和购买数量，计算应付金额，
				 * 如果是折扣商品，打七折；如果购买数量超过库存量，给出提示； 商品不存在，给出提示；购买成功，扣除相应的数量。最后输出应付款的金额。
				 */
				System.out.print("请输入需要修改的商品编号：");
				int ID = input.nextInt();
				System.out.print("请输入需要修改的商品数量：");
				int Num = input.nextInt();
				buy(ID, Num);

			} else if (num == 5) {// 5、增加新商品信息
				System.out.println("=>>5、增加新商品信息");
				/**
				 * 5、增加新商品的功能，要求商品号和商品名称都不能重复（即不能和已经存在的重复）
				 */
//				System.out.print("请输入需要增加的商品编号：");
//				int id = input.nextInt();
//				System.out.print("请输入需要增加的商品数量：");
//				String name = input.next();
//				System.out.print("请输入需要增加的商品单价：");
//				double price = input.nextDouble();
//				System.out.print("请输入需要增加的商品上架数量：");
//				int pNum = input.nextInt();
//				System.out.print("请输入需要增加的商品计量单位：");
//				String unit = input.next();
//				System.out.print("请输入需要增加的商品是否打折（true/false）：");
//				String discount = input.next();
//				System.out.print("请输入需要增加的商品原产地：");
//				String address = input.next();
//				add(id, name, price, pNum, unit, discount, address);
				add(6666, "卡旺卡", 21, 100, "杯", "false", "合肥");

			} else if (num == 6) {// 6、删除商品信息
				System.out.println("=>>6、删除商品信息");
				/**
				 * 删除节点
				 */
				System.out.print("请输入需要删除的商品名称：");
				String name = input.next();
				del(name);

			} else if (num == 7) {// 7、退出程序
				System.out.println("=>>7、退出程序");
				System.out.println("程序已退出,谢谢使用！");
				break;
			} else {
				System.out.println("-" + num + "-输入无效，请重新输入！");
			}

		}
	}

}
